我有一个async不返回数据的方法:
async
public async Task MyAsyncMethod() { // do some stuff async, don't return any data }
我从另一个返回一些数据的方法调用它:
public string GetStringData() { MyAsyncMethod(); // this generates a warning and swallows exceptions return "hello world"; }
在没有等待的情况下调用MyAsyncMethod()会导致“因为不等待此调用,当前方法在调用完成之前继续运行”警告在 Visual Studio 中。在该警告的页面上,它指出:
MyAsyncMethod()
仅当您确定不想等待异步调用完成并且 被调用的方法不会引发任何异常时 ,才应考虑取消警告。
我确定我不想等待通话完成;我不需要也没有时间。 但是调用 可能会 引发异常。
我偶然发现了这个问题几次,我确信这是一个常见的问题,必须有一个共同的解决方案。
如何在不等待结果的情况下安全地调用异步方法?
对于建议我等待结果的人来说,这是响应我们 Web 服务 (ASP.NET Web API) 上的 Web 请求的代码。在 UI 上下文中等待使 UI 线程保持空闲,但在 Web 请求调用中等待将等待任务完成后再响应请求,从而无缘无故地增加响应时间。
如果你想“异步”获取异常,你可以这样做:
MyAsyncMethod(). ContinueWith(t => Console.WriteLine(t.Exception), TaskContinuationOptions.OnlyOnFaulted);
这将允许您处理“主”线程以外的线程上的异常。这意味着您不必“等待”MyAsyncMethod()来自调用 ; 的线程的调用MyAsyncMethod。但是,仍然允许您对异常执行某些操作——但前提是发生异常。
MyAsyncMethod
从技术上讲,你可以做类似的事情await:
await
try { await MyAsyncMethod().ConfigureAwait(false); } catch (Exception ex) { Trace.WriteLine(ex); }
try…如果您需要专门使用/ catch(或) ,这将很有用,using但我发现ContinueWith更明确一点,因为您必须知道什么ConfigureAwait(false)意思。
try
catch
using
ContinueWith
ConfigureAwait(false)